import type { PropType } from 'vue'

import type { 
  IOptionList,
  IOptionTree,
  IWebAPI
} from '../types/20-form-item'

/**
 * 基础控件的共用属性，即表单子控件的基础属性
 */
export const itemProps = {
  /**
   * 字段ID、控件ID
   */
  columnId: {
    type: [Number, String],
    default: () => Math.floor((Math.random() * 1000000) + 1) // new Date().valueOf()
  },
  /**
   * // 表单的 model，可以整体传入，便于子控件维护字段值。
   */
  model: {
    type: Object
  },
  /**
   * 字段名称，控件使用 model 的哪个属性，多个字段名称用 “_” 分割
   */
  colName: {
    type: String,
    default: ''
  },
  /**
   * 控件类型，表单控件据此加载对应的子控件
   */
  controlType: {
    type: [Number],
    default: 101
  },
  /**
   * 控件的备选项，单选、多选、等控件需要
   */
  optionList: {
    type: Object as PropType<Array<IOptionList | IOptionTree>>,
    default: () =>  {return []}
  },
  /**
   * 访问后端API的参数，IWebAPI
   */
  webAPI: {
    type: Object as PropType<IWebAPI>,
    default: () => {
      return {
        serviceId: '',
        actionId: '',
        dataId: '',
        body: null,
        cascader: {
          lazy: false, // 是否需要动态加载
          actions: ['',''] // 按照level的顺序设置后端 API 的 action
        }
      }
    }
  },
  /**
   * 防抖的时间间隔，0：不用防抖。
   */
  delay: {
    type: Number,
    default: 0
  },
  /**
   * 事件集合，主要用于防抖
   */
  events: {
    type: Object,
    default: () => {
      return {
        input: () => {}, // input 事件
        enter: () => {}, // 按了回车
        keydown: () => {} // 正在输入
      }
    }
  },
  /**
   * 子控件的规格，默认设置。
   * * 【element-plus】large / default / small 三选一
   */
  size: { // 
    type: String,
    default: 'small',
    validator: (value) => {
      // 这个值必须匹配下列字符串中的一个
      return ['large', 'default ', 'small'].indexOf(value) !== -1
    }
  },
  /**
   * 是否显示可清空的按钮，默认显示
   */
  clearable: {
    type: Boolean,
    default: true
  },
  /**
   * 扩展属性，对象形式，存放组件的扩展属性
   */
  extend: {
    type: Object,
    default: () => {return {}}
  }
}
 